/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package beans;

import general.util.EntitiesValidation;
import general.util.MyDateUtil;
import general.util.MyPassDataUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import jpa.controller.EmpresaJpaController;
import jpa.controller.FornecedorJpaController;
import jpa.controller.PedidoJpaController;
import jpa.controller.ProdutoJpaController;
import jpa.controller.TipoPagamentoJpaController;
import jpa.entity.Empresa;
import jpa.entity.Fornecedor;
import jpa.entity.Obra;
import jpa.entity.Pedido;
import jpa.entity.Produto;
import jpa.entity.Produto_Pedido;
import jpa.entity.TipoPagamento;
import jpa.util.SharedPersistPedido;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import resources.reports.PedidoParams;
import resources.reports.ReportManager;


/**
 *
 * @author isaias
 */
@ManagedBean
@ViewScoped
public class pedidoBean implements Serializable{

    private String numeroPedidoFiltrer = null;
   
    private Pedido pedidoSelected = new Pedido();
    private Pedido pedido = new Pedido();
    private Fornecedor fornecedorSelected = new Fornecedor();
    private Empresa empresaSelected = new Empresa();
    private Obra obraSelected = new Obra();
    private String nameProductFilter=null;
    private Produto produtoSelected = new Produto();
    private Produto_Pedido produto_pedido = new Produto_Pedido();
    private Produto_Pedido produto_pedidoSelected = new Produto_Pedido();
    private List<Produto_Pedido> produto_pedidos = new ArrayList<Produto_Pedido>();
    private List<TipoPagamento> tipoPagamentos = new ArrayList<TipoPagamento>();
    private String numeroPedidoFilter = null;
    private PedidoParams pedidoParams = new PedidoParams();

    /** Creates a new instance of pedidoBean */
    public pedidoBean() {
        initListFormasPagamento();
    }

    private void initListFormasPagamento(){
        tipoPagamentos = new TipoPagamentoJpaController().findTipoPagamentoEntities();
    }

     public void fornecedorSelectListener(SelectEvent event) {

        String name = null;

        if (event.getObject() instanceof String) {
            name = (String) event.getObject();
            fornecedorSelected = new Fornecedor();

            fornecedorSelected.setName(name.trim().toUpperCase());

           fornecedorSelected = new FornecedorJpaController().findFornecedorForName(fornecedorSelected.getName());

        } else if (event.getObject() instanceof Fornecedor) {
            fornecedorSelected = (Fornecedor) event.getObject();
        } else {
            throw new RuntimeException("Erro ao converter fornecedor " + event.getObject().getClass());
        }

        if (fornecedorSelected == null) {
            fornecedorSelected = new Fornecedor();
        }

        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fornecedor selecionado (" + fornecedorSelected.getName() + ")", null);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

   public void initFormEditPedido(){
       System.out.println(">>>>> Editar pedido number: "+pedidoSelected.getNumber());

       empresaSelected = pedidoSelected.getEmpresa();
       fornecedorSelected = pedidoSelected.getFornecedor();
       obraSelected = pedidoSelected.getObra();
       produto_pedidos = pedidoSelected.getProdutos_pedido();
   }

    public void empresaSelectListener(SelectEvent event) {

        String name = null;

        if (event.getObject() instanceof String) {
            name = (String) event.getObject();
            empresaSelected = new Empresa();

            empresaSelected.setName(name.trim().toUpperCase());

            empresaSelected = new EmpresaJpaController().findEmpresaForName(empresaSelected.getName());


        } else if (event.getObject() instanceof Empresa) {

            empresaSelected = (Empresa) event.getObject();

        } else {
            throw new RuntimeException("Erro ao converter empresa " + event.getObject().getClass());
        }

        if (empresaSelected == null) {
            empresaSelected = new  Empresa();
        }

        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Empresa selecionada (" + empresaSelected.getName() + ")", null);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public List<Produto> listProdutos(){
        return new ProdutoJpaController().findProdutoForName(nameProductFilter);
    }

    public List<Pedido> listPedido(){

        return new PedidoJpaController().findPedidoForNumberAndObra(numeroPedidoFilter, MyPassDataUtil.getInstance().getCurrentObra());
    }

    public void selectProductListener(Produto p){
            produtoSelected = p;
    }

    private void configureParamsPedido(){
      String end = "";
        pedidoParams.setCnpjEmpresa(pedidoSelected.getEmpresa().getCnpj());
        pedidoParams.setDiasPagamento(pedidoSelected.getDatasPagamento());
        pedidoParams.setEmail(pedidoSelected.getEmpresa().getEmail());
        pedidoParams.setEnderecoEmpresa(pedidoSelected.getEmpresa().getEndereco());
        pedidoParams.setIeEmpresa(pedidoSelected.getEmpresa().getIe());


         if(pedidoSelected.getObra().getCidade() == null){
             end = pedidoSelected.getObra().getEndereco()+", "+pedidoSelected.getObra().getBairro();

         }else{
            end = pedidoSelected.getObra().getEndereco()+", "+pedidoSelected.getObra().getBairro() +" - "+pedidoSelected.getObra().getCidade().getName();
         }
        pedidoParams.setLocalEntrega(end);
        pedidoParams.setNameEmpresa(pedidoSelected.getEmpresa().getName());
        pedidoParams.setNameFornecedor(pedidoSelected.getFornecedor().getName());
        pedidoParams.setNomeObra(pedidoSelected.getObra().getName());
        pedidoParams.setObs(pedidoSelected.getObs());
        pedidoParams.setTelefoneFornecedor(pedidoSelected.getFornecedor().getTelefone());
        pedidoParams.setTelefoneEmpresa(pedidoSelected.getEmpresa().getTelefone());
        pedidoParams.setTelefoneVendedor(pedidoSelected.getFornecedor().getTelefoneVendedor());
        pedidoParams.setTipoPagamento(pedidoSelected.getTipoPagamento().getName());
        pedidoParams.setValor(""+pedidoSelected.getValorBruto());
        pedidoParams.setValorFrete(""+pedidoSelected.getValorFrete());
        pedidoParams.setValorTotal(""+pedidoSelected.getValorLiquido());
        pedidoParams.setNumeroPedido(pedidoSelected.getNumber());
        pedidoParams.setPedidoData(""+pedidoSelected.getDataPedido());
        pedidoParams.setProduto_Pedido(produto_pedidos);
        pedidoParams.setVendedor(pedidoSelected.getFornecedor().getVendedor());


    }

    public void generateReportPedido(){
         configureParamsPedido();

        try {
            ReportManager.generatePedido(pedidoParams);
            //imprimir direto 
           // PrintPDFManager.printPDF(new File(pedidoParams.getFilePath()), false);
  
             RequestContext.getCurrentInstance().execute("showPedidoPDFDialog.show(); zPrint('pedidoFrameReport'); showPedidoPDFDialog.hide();");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
    }

    public void sairPedido() {
        System.err.print("Clicou sair.............");
        pedidoSelected = new Pedido();
        pedidoParams = new PedidoParams();
        RequestContext.getCurrentInstance().execute("editPedido.hide();");
    }

    public StreamedContent downloadAttestationPDF() {

        if (pedidoParams.getFilePath() != null) {
            try {
                StreamedContent streamedContent = new DefaultStreamedContent(new FileInputStream(pedidoParams.getFilePath()),
                        pedidoParams.getFormat().getContentType(),
                        pedidoParams.humanReportFileName() + pedidoParams.getFormat().getExtension());
                
                return streamedContent;

            } catch (FileNotFoundException ex) {
               ex.printStackTrace();
            }

        }

        return null;

    }

    public void ProdutoSelectListener(SelectEvent event) {

        String name = null;

        if (event.getObject() instanceof String) {
            name = (String) event.getObject();

            produtoSelected = new Produto();

            produtoSelected.setName(name.trim().toUpperCase());

            produtoSelected = new ProdutoJpaController().findProdutoByName(produtoSelected.getName());


        } else if (event.getObject() instanceof Produto) {
            produtoSelected = (Produto) event.getObject();
        } else {
            throw new RuntimeException("Erro ao converter produto " + event.getObject().getClass());
        }
        
        if (produtoSelected == null) {
            produtoSelected = new Produto();
        }

        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Produto selecionado (" + produtoSelected.getName() + ")", null);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void calcularValorDescontoListener(Pedido p){

               try{
                   pedido.setValorLiquido(pedido.getValorLiquido() - p.getDesconto());
                   pedido.setDesconto(p.getDesconto());
               }catch(Exception ex){
                   ex.printStackTrace();
               }
    }


    /*
     * Metodo para calcular o valor total com o acrescimo do valor do frete
     */
    public void calcularValorFreteListener(Pedido p){

               try{
                   pedido.setValorLiquido(pedido.getValorLiquido() + p.getValorFrete());
                   pedido.setValorFrete(p.getValorFrete());
               }catch(Exception ex){
                   ex.printStackTrace();
               }
    }


    private void calcularValorPedido(){
                Double valorPedido=0.0;
           for(Produto_Pedido p : produto_pedidos){
                valorPedido += p.getValorTotal();
           }
                pedido.setValorBruto(valorPedido);
                pedido.setValorLiquido(valorPedido);
    }

     public void addProduto_Nota(){

          Double quantidade = produto_pedido.getQuantidade();
         
               Double valor = produto_pedido.getValor();
        List<String> validate = EntitiesValidation.validateAddProduto_Nota(produto_pedido);

        if(validate.isEmpty()){
           if(obraSelected == null){
                 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Você precisa preencher o campo nome da obra, para poder prosseguir!", null));
           }else{
                produto_pedido.setObra(obraSelected);
                produto_pedido.setValorTotal(quantidade * valor);
                produto_pedido.setProduto(produtoSelected);

                try{         
                    produto_pedidos.add(produto_pedido);
                         FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "Item adicionado com sucesso!", null));
                         RequestContext.getCurrentInstance().execute("newProductAdd.hide();");
                    calcularValorPedido();
                    cancelar();
                }catch(Exception ex){
                    ex.printStackTrace();
                }
           }
        }else{
            for(String e : validate){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        e, null));
            }
        }
    }

    public boolean renderPanelPedidoDownloadPDF(){
        if (pedidoParams.getFilePath() == null
                || !(new File(pedidoParams.getFilePath()).exists())) {
            return false;
        }
              
        return true;
    }

    public void save(){
         pedido.setEmpresa(empresaSelected);
         pedido.setFornecedor(fornecedorSelected);
         pedido.setObra(obraSelected);
         pedido.setProdutos_pedido(produto_pedidos);
         pedido.setDataPedido(new Date());
         pedido.setUser(MyPassDataUtil.getInstance().getCurrentUser());
         pedido.setNumber(MyDateUtil.getMinuteHourDaysMonthYearForPedido());
         SharedPersistPedido.merge(pedido);
    }

    public void cancelar(){
        produtoSelected = new Produto();
        produto_pedido = new Produto_Pedido();
    }

    public List<Produto_Pedido> getProduto_pedidos() {
        return produto_pedidos;
    }

    public void setProduto_pedidos(List<Produto_Pedido> produto_pedidos) {
        this.produto_pedidos = produto_pedidos;
    }
    
    public Produto_Pedido getProduto_pedido() {
        return produto_pedido;
    }

    public void setProduto_pedido(Produto_Pedido produto_pedido) {
        this.produto_pedido = produto_pedido;
    }
    
    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

    public Pedido getPedidoSelected() {
        return pedidoSelected;
    }

    public void setPedidoSelected(Pedido pedidoSelected) {
        this.pedidoSelected = pedidoSelected;
    }

    public String getNumeroPedidoFiltrer() {
        return numeroPedidoFiltrer;
    }

    public void setNumeroPedidoFiltrer(String numeroPedidoFiltrer) {
        this.numeroPedidoFiltrer = numeroPedidoFiltrer;
    }

    public Fornecedor getFornecedorSelected() {
        return fornecedorSelected;
    }

    public void setFornecedorSelected(Fornecedor fornecedorSelected) {
        this.fornecedorSelected = fornecedorSelected;
    }

    public Empresa getEmpresaSelected() {
        return empresaSelected;
    }

    public void setEmpresaSelected(Empresa empresaSelected) {
        this.empresaSelected = empresaSelected;
    }

    public Obra getObraSelected() {
        return obraSelected;
    }

    public void setObraSelected(Obra obraSelected) {
        this.obraSelected = obraSelected;
    }

    public String getNameProductFilter() {
        return nameProductFilter;
    }

    public void setNameProductFilter(String nameProductFilter) {
        this.nameProductFilter = nameProductFilter;
    }

    public Produto getProdutoSelected() {
        return produtoSelected;
    }

    public void setProdutoSelected(Produto produtoSelected) {
        this.produtoSelected = produtoSelected;
    }

    public List<TipoPagamento> getTipoPagamentos() {
        return tipoPagamentos;
    }

    public void setTipoPagamentos(List<TipoPagamento> tipoPagamentos) {
        this.tipoPagamentos = tipoPagamentos;
    }

    public String getNumeroPedidoFilter() {
        return numeroPedidoFilter;
    }

    public void setNumeroPedidoFilter(String numeroPedidoFilter) {
        this.numeroPedidoFilter = numeroPedidoFilter;
    }

    public Produto_Pedido getProduto_pedidoSelected() {
        return produto_pedidoSelected;
    }

    public void setProduto_pedidoSelected(Produto_Pedido produto_pedidoSelected) {
        this.produto_pedidoSelected = produto_pedidoSelected;
    }

    public PedidoParams getPedidoParams() {
        return pedidoParams;
    }

    public void setPedidoParams(PedidoParams pedidoParams) {
        this.pedidoParams = pedidoParams;
    }
 
    
}
